"""
has a:
    在一个类中引用另一个自定义的类 ：类如在student中使用computer
is a:（实类的判断） base class 父类 基类
    系统类型
        str int  float
        list dict tuple set
    自定义类型：
        s = Student()       s 是student类型的对象


继承：
    1、高内聚、降低重复代码
    2、
特点：
    1、如果类中不定义__init__,调用父类中 supper class 的__init__
    2、如果类继承父类也需要定义自己的__init__,就需要在当前类__init__调用父类的__init__
    3、如何调用父类__init__:
        super().__init__(参数)
        super(类名，对象).__init__(参数)
    4、如果父类有eat(),子类也定义了一个eat方法，默认搜索的原则；先找当前类，再找父类：
        t.eat()
        override:重写（覆盖）
            父类提供的方法无法满足子类的需求，需要子类定义一个同名的方法
    5、
"""


class Computer:
    def __init__(self, brand, type, color):
        self.brand = brand
        self.type = type
        self.color = color

    def on_line(self):
        print("正在使用电脑上网")

    def __str__(self):
        return self.brand + "---" + self.type + "---" + self.color


class Book:
    def __init__(self, book_name, author, number):
        self.book_name = book_name
        self.author = author
        self.number = number

    def __str__(self):
        return self.book_name + "---" + self.author + "---" + str(self.number)


class Student:  # has a
    def __init__(self, name, computer, book):
        self.name = name
        self.computer = computer
        self.books = []
        self.books.append(book)

    def borrow_book(self, book):
        for bk in self.books:
            if bk.book_name == book.book_name:
                print("已经借过了")
            else:
                self.books.append(book)
                print("添加成功了")

    def show_book(self):
        for book in self.books:
            print(book.book_name)

    def __str__(self):
        return self.name + "---" + str(self.computer) + "---" + str(self.books)


computer = Computer("联想", "e430", "银色")

b = Book("盗墓笔记", "南派三叔", 10)

s = Student("张三", computer, b)

print(s)
bk = Book("鬼吹灯", "天下霸唱", 8)

s.borrow_book(bk)

print("-------------------------->")
s.show_book()

print("is a".center(30, "*"))


class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def eat(self):
        print(self.name + "正在吃饭......")

    def run(self):
        print(self.name + "正在跑步......")


class Employee(Person):
    def __init__(self, name, age, salary):
        super(Employee, self).__init__(name, age)
        self.salary = salary

    pass


class Teacher(Person):
    def __init__(self, name, age, clazz):
        """
         调用父类的init初始化
        :param name: 姓名
        :param age: 年龄
        :param clazz: 班级
        """
        super().__init__(name, age)
        self.clazz = clazz

    def attend_class(self):
        print("{}老师正在上课，马上下课".format(self.name))

    def eat(self):
        """
        注意：
            按照名称寻找，而不是像java一样根据参数判断
        :return:
        """
        print("子类正在重构父类的eat方法")

    def __str__(self):
        return "{}老师，今年{}岁，现在教{}班".format(self.name, self.age, self.clazz)

    pass


e = Employee("张三", 18, 10000)

e.run()
e.eat()

t = Teacher("李四", 30, 5)
print(t)
t.attend_class()
t.eat()
